#include <iostream>
#include <vector>

using namespace std;

int maxi(int x, int y)
{ return ((x>y)?x:y); }

int mini(int x, int y)
{ return ((x<y)?x:y); }

struct Punto{
  int x,y; };

istream &operator>>(istream &is, Punto &p)
{
  is>>p.x>>p.y;
  return is;
}

float abs(float x)
{ return (x < 0 ? -x : x); }

/* Checks if p is inside the fucking bounding box
  of the shitting segment formed by ps1 and ps2 */
bool isInBoundingBox(Punto ps1, Punto ps2, Punto p){
  if((mini(ps1.x,ps2.x)<=p.x && p.x<=maxi(ps1.x,ps2.x)) &&
     (mini(ps1.y,ps2.y)<=p.y && p.y<=maxi(ps1.y,ps2.y)))
    return true;
  return false; }

/*  The cross product: (p1-p) X (p2-p): Zero if parallel */
int CrossProduct(Punto p1, Punto p2, Punto p)
{ return ((p1.x-p.x)*(p2.y-p.y) - (p2.x-p.x)*(p1.y-p.y)); }

/* Watch out that if p touch the borders
is considered that p inside the polygon. */
bool isPointInside(vector<Punto *>polygon, Punto *p){
  int d=0,prevD;
  for(int i=0;i<polygon.size();i++)
  {
    prevD = CrossProduct((*polygon[i]),
		    (*polygon[((i+1)%polygon.size())]),
		    (*p));
		if(d==0 && prevD!=0) d = prevD;
    if((prevD>0 && d<0) || (prevD<0 && d>0) )
      return false;
    if((prevD==0 && isInBoundingBox((*polygon[i]),
			     (*polygon[((i+1)%polygon.size())]),
			     (*p)))) return true;
  }
  return true;
}

int main()
{
  int nPoints;

  char rTags[3];
  vector <Punto *> Triangle;
  float maxArea;
  int aPointInside;
  
  while(true)
  {
    cin>>nPoints;
    
    if(nPoints==0) break;
    
    char tag[nPoints];
    Punto puntos[nPoints];
    
    for(int i=0; i<nPoints; i++)
    {
      cin>>tag[i]>>puntos[i];
      ///cout<<puntos[i].x<<","<<puntos[i].y<<endl;
    }
    
    maxArea = 0;
    
    for(int i=0; i<nPoints; i++)
    {
      for(int j=i+1; j<nPoints; j++)
      {
        for(int k=j+1; k<nPoints; k++)
        {
          Triangle.clear();
          Triangle.push_back(puntos+i);
          Triangle.push_back(puntos+j);
          Triangle.push_back(puntos+k);
 //         cout<<i<<" "<<j<<" "<<k<<endl;
          /*
          for(int x=0; x<3; x++)
          {
            cout<<Triangle[x]->x<<","<<Triangle[x]->y<<endl;
          }
          */
          if(maxArea < abs(CrossProduct((*Triangle[0]),(*Triangle[1]),(*Triangle[2])))/2)
          {
            aPointInside = 0;
//            cout<<aPointInside<<endl;
            for(int l=0; l<nPoints; l++)
            {
              if( l == i || l == j || l == k ) continue;
              if( isPointInside(Triangle, (puntos+l) ) )
              {
//                cout<<"inside is: "<<l<<endl;
                aPointInside = 1;
                break;
              }
            }
//            cout<<aPointInside<<endl;
            if(!aPointInside)
            {
              maxArea = abs(CrossProduct((*Triangle[0]),(*Triangle[1]),(*Triangle[2])))/2;
              rTags[0] = tag[i];
              rTags[1] = tag[j];
              rTags[2] = tag[k];
            }
          }
//          cout<<maxArea<<" - "<<abs(CrossProduct((*Triangle[0]),(*Triangle[1]),(*Triangle[2])))/2<<endl<<endl;
        }
      }
    }
    cout<<rTags[0]<<rTags[1]<<rTags[2]<<endl;
  }
}
